/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bbdd.mysql;

import bbdd.classes.Coche;
import bbdd.classes.RutaDet2;
import bbdd.classes.TrutaMae;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ConexionMysql {

    private Connection connection = null;
    private Statement statement = null;

    public boolean connect(String nombreServidor, String nombreBBDD, boolean auth, String usuario, String pass) {
        boolean resultado;
        resultado = false;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            if (auth == true) {
                //System.out.println("Con autentificacion");
                connection = DriverManager.getConnection("jdbc:mysql://" + nombreServidor + "/" + nombreBBDD, usuario, pass);
            } else {
                //System.out.println("Sin autentificacion");
                connection = DriverManager.getConnection("jdbc:mysql://" + nombreServidor + "/" + nombreBBDD);
            }
            
            resultado = true;
            Logger.getLogger( ConexionMysql.class.getName()).log(Level.INFO, "Conectado a la base de datos SQLite [{0}]", nombreBBDD);

        } catch (ClassNotFoundException | SQLException e) {
            Logger.getLogger( ConexionMysql.class.getName()).log(Level.SEVERE, null, e);
            resultado = false;
        }
        return resultado;
    }

    public boolean isConnected() {
        boolean resultado = false;
        try {
            if (connection != null && !connection.isClosed()) {
                resultado = true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConexionMysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultado;
    }

    public List<Coche> getCoches() {
        List<Coche> resultado = null;

        if (isConnected()) {
            try {
                PreparedStatement ps = connection.prepareStatement("SELECT idCoche, descripcion from coche");
                ResultSet rs = ps.executeQuery();
                Coche aux = null;
                resultado = new ArrayList<>();
                while (rs.next()) {
                    aux = new Coche();
                    aux.setIdCoche(rs.getInt("Idcoche"));
                    aux.setDescripcion(rs.getString("descripcion"));
                    resultado.add(aux);
                }
            } catch (SQLException ex) {
                Logger.getLogger(ConexionMysql.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return resultado;
    }

    public boolean insertarCoche(String descripcion) {
        boolean resultado = false;

        if (isConnected()) {
            try {
                PreparedStatement ps = connection.prepareStatement("insert into coche (descripcion) values(?)");
                ps.setString(1, descripcion);
                return (ps.executeUpdate() == 1);

            } catch (SQLException ex) {
                Logger.getLogger(ConexionMysql.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return resultado;
    }
    
    /**
     * 
     * @param cocheSeleccionado
     * @param rutaSeleccionada
     * @param listaTrayecto
     * @return
     * @deprecated Ahora se usa en dos partes insertarRuta e insertarTrayecto
     */
    @Deprecated
    public boolean insertarRuta(Coche cocheSeleccionado, TrutaMae rutaSeleccionada, List<RutaDet2> listaTrayecto) {
        boolean resultado = false;
        int idRuta;
        ResultSet rs;
        if (isConnected()) {
            try {
                PreparedStatement ps = connection.prepareStatement("insert into trutamae (fecha,descripcion,coche_idCoche) values(?,?,?)");
                ps.setDate(1, new java.sql.Date(rutaSeleccionada.getFecha().getTime()));
                ps.setString(2, rutaSeleccionada.getDescripcion());
                ps.setInt(3, cocheSeleccionado.getIdCoche());
                if (ps.executeUpdate() == 1) {
                    ps = connection.prepareStatement("Select idRuta from trutamae where fecha = ? and descripcion = ? and coche_idCoche = ?");
                    ps.setDate(1, new java.sql.Date(rutaSeleccionada.getFecha().getTime()));
                    ps.setString(2, rutaSeleccionada.getDescripcion());
                    ps.setInt(3, cocheSeleccionado.getIdCoche());
                    rs = ps.executeQuery();
                    if (rs.next()) {
                        idRuta = rs.getInt("idRuta");
                        ps = connection.prepareStatement("insert into rutadet2(Idruta, GPRMC, timeStamp, validSt, currentLat, nS, currentLon, eW, speed, trueCourse, dataStamp, CRC ) "
                                + " values(?,?,?,?,?,?,?,?,?,?,?,?)");
                        for (RutaDet2 aux : listaTrayecto) {
                            ps.setInt(1, idRuta);
                            ps.setString(2, aux.getGprmc());
                            ps.setTimestamp(3, aux.getTimeStamp());
                            ps.setString(4, aux.getValidSt());
                            ps.setDouble(5, aux.getCurrentLat());
                            ps.setString(6, aux.getNs());
                            ps.setDouble(7, aux.getCurrentLon());
                            ps.setString(8, aux.getEw());
                            ps.setDouble(9, aux.getSpeed());
                            ps.setDouble(10, aux.getTrueCourse());
                            ps.setDate(11, new java.sql.Date(aux.getDataStamp().getTime()));
                            ps.setString(12, aux.getCrc());
                            ps.executeUpdate();
                        }
                    }
                }
                resultado = true;
            } catch (SQLException ex) {
                Logger.getLogger(ConexionMysql.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return resultado;
    }

    public int insertarRuta(int cocheSeleccionado, TrutaMae rutaSeleccionada) {
        int idRuta = 0;
        ResultSet rs;
        if (isConnected()) {
            try {
                PreparedStatement ps = connection.prepareStatement("insert into trutamae (fecha,descripcion,coche_idCoche) values(?,?,?)");
                ps.setDate(1, new java.sql.Date(rutaSeleccionada.getFecha().getTime()));
                ps.setString(2, rutaSeleccionada.getDescripcion());
                ps.setInt(3, cocheSeleccionado);
                if (ps.executeUpdate() == 1) {
                    ps = connection.prepareStatement("Select idRuta from trutamae where fecha = ? and descripcion = ? and coche_idCoche = ?");
                    ps.setDate(1, new java.sql.Date(rutaSeleccionada.getFecha().getTime()));
                    ps.setString(2, rutaSeleccionada.getDescripcion());
                    ps.setInt(3, cocheSeleccionado);
                    rs = ps.executeQuery();
                    if (rs.next()) {
                        idRuta = rs.getInt("idRuta");
                    }
                }
            } catch (SQLException ex) {
                Logger.getLogger(ConexionMysql.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        return idRuta;
    }

    public boolean insertarTrayecto(int idRuta, List<RutaDet2> listaTrayecto) {
        boolean resultado = false;
        int resultadoInt = 0;
        PreparedStatement ps;
        try {
            ps = connection.prepareStatement("insert into rutadet2(Idruta, GPRMC, timeStamp, validSt, currentLat, nS, currentLon, eW, speed, trueCourse, dataStamp, CRC ) "
                    + " values(?,?,?,?,?,?,?,?,?,?,?,?)");

            for (RutaDet2 aux : listaTrayecto) {
                ps.setInt(1, idRuta);
                ps.setString(2, aux.getGprmc());
                ps.setTimestamp(3, aux.getTimeStamp());
                ps.setString(4, aux.getValidSt());
                ps.setDouble(5, aux.getCurrentLat());
                ps.setString(6, aux.getNs());
                ps.setDouble(7, aux.getCurrentLon());
                ps.setString(8, aux.getEw());
                ps.setDouble(9, aux.getSpeed());
                ps.setDouble(10, aux.getTrueCourse());
                ps.setDate(11, new java.sql.Date(aux.getDataStamp().getTime()));
                ps.setString(12, aux.getCrc());
                resultadoInt = resultadoInt + ps.executeUpdate();
            }
            if (resultadoInt == listaTrayecto.size()) {
                resultado = true;
            }
        } catch (SQLException ex) {
            Logger.getLogger(ConexionMysql.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultado;

    }
}
